package validate

import (
	"fmt"
	"github.com/dlclark/regexp2"
	"github.com/go-playground/validator/v10"
	"regexp"
)

// checkPhoneFunc 检查手机号
func checkPhoneFunc(fl validator.FieldLevel) bool {
	//这里写程序验证手机号
	// 匹配规则
	// ^1第一位为一
	// [345789]{1} 后接一位345789 的数字
	// \\d \d的转义 表示数字 {9} 接9位
	// $ 结束符
	regRuler := "^1[345789]{1}\\d{9}$"

	// 正则调用规则
	reg := regexp.MustCompile(regRuler)

	// 返回 MatchString 是否匹配
	return reg.MatchString(fl.Field().String())
}

// CheckIdCard 检验身份证
func CheckIdCard(fl validator.FieldLevel) bool {
	//18位身份证 ^(\d{17})([0-9]|X)$
	// 匹配规则
	// (^\d{15}$) 15位身份证
	// (^\d{18}$) 18位身份证
	// (^\d{17}(\d|X|x)$) 18位身份证 最后一位为X的用户
	regRuler := "(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)"

	// 正则调用规则
	reg := regexp.MustCompile(regRuler)

	// 返回 MatchString 是否匹配
	return reg.MatchString(fl.Field().String())
}

// checkPswFunc 检验密码
func checkPswFunc(fl validator.FieldLevel) bool {
	expr := `^(?![0-9a-zA-Z]+$)(?![a-zA-Z!@#$%^&*]+$)(?![0-9!@#$%^&*]+$)[0-9A-Za-z!@#$%^&*]{8,16}$`
	reg, _ := regexp2.Compile(expr, 0)
	m, _ := reg.FindStringMatch(fl.Field().String())
	if m != nil {
		res := m.String()
		fmt.Println(res)
		return false
	}
	return true
}

// 密码强度必须为字⺟⼤⼩写+数字+符号，9位以上
func CheckPasswordLever(ps string) error {
	if len(ps) < 9 {
		return fmt.Errorf("password len is < 9")
	}
	num := `[0-9]{1}`
	a_z := `[a-z]{1}`
	A_Z := `[A-Z]{1}`
	symbol := `[!@#~$%^&*()+|_]{1}`
	if b, err := regexp.MatchString(num, ps); !b || err != nil {
		return fmt.Errorf("password need num :%v", err)
	}
	if b, err := regexp.MatchString(a_z, ps); !b || err != nil {
		return fmt.Errorf("password need a_z :%v", err)
	}
	if b, err := regexp.MatchString(A_Z, ps); !b || err != nil {
		return fmt.Errorf("password need A_Z :%v", err)
	}
	if b, err := regexp.MatchString(symbol, ps); !b || err != nil {
		return fmt.Errorf("password need symbol :%v", err)
	}
	return nil
}

//func matchStr(str string) string {
//	expr := `^(?![0-9a-zA-Z]+$)(?![a-zA-Z!@#$%^&*]+$)(?![0-9!@#$%^&*]+$)[0-9A-Za-z!@#$%^&*]{8,16}$`
//	reg, _ := regexp2.Compile(expr, 0)
//	m, _ := reg.FindStringMatch(str)
//	if m != nil {
//		res := m.String()
//		return res
//	}
//	return "密码包含至少一位数字，字母和特殊字符,且长度8-16"
//
//	//“^(?![0-9a-zA-Z]+$)(?![a-zA-Z!@#$%^&*]+$)(?![0-9!@#$%^&*]+$)[0-9A-Za-z!@#$%^&*]{8,16}$”中：
//	//(?![0-9a-zA-Z]+$) 表示匹配后面非数字，非字母的字符
//	//
//	//(?![a-zA-Z!@#$%^&*]+$) 表示匹配后面非字母，非特殊字符的字符
//	//
//	//(?![0-9!@#$%^&*]+$) 表示匹配后面非数字，非特殊字符的字符
//	//
//	//[0-9A-Za-z!@#$%^&,.*]{8,16} 表示长度8-16，可以是任意的数字，字母和其中包含的特殊字符
//}

/*

1种
只能由1种组成
只能由字母组成，1-9位
^[a-zA-Z]{1,9}$

只能由数字组成，1-9位
^\d{1,9}$

只能由特殊字符组成，1-9位
^[^\da-zA-Z\s]{1,9}$

至少包含1种
至少包含字母，1-9位
^(?=.*[a-zA-Z]).{1,9}$

至少包含数字，1-9位
^(?=.*\d).{1,9}$

至少包含特殊字符，1-9位
^(?=.*[^\da-zA-Z\s]).{1,9}$

2种
只能由2种组成
只能由字母、数字组成，1-9位
^(?=.*\d)(?=.*[A-z])[\da-zA-Z]{1,9}$

只能由字母、特殊字符组成，1-9位
^(?=.*[a-zA-Z])(?=.*[^\da-zA-Z\s])([a-zA-Z]|[^\da-zA-Z\s]){1,9}$

只能由数字、特殊字符组成，1-9位
^(?=.*\d)(?=.*[^\da-zA-Z\s])(\d|[^\da-zA-Z\s]){1,9}$

至少包含2种
至少包含字母、数字，1-9位
^(?=.*[a-zA-Z])(?=.*\d).{1,9}$

至少包含字母、特殊字符，1-9位
^(?=.*[a-zA-Z])(?=.*[^\da-zA-Z\s]).{1,9}$

至少包含数字、特殊字符，1-9位
^(?=.*\d)(?=.*[^\da-zA-Z\s]).{1,9}$

任意2种组成
由字母、数字、特殊字符，任意2种组成，1-9位
^(?![a-zA-Z]+$)(?!\d+$)(?![^\da-zA-Z\s]+$).{1,9}$

3种
至少包含3种
至少包含字母、数字、特殊字符，1-9位
^(?=.*\d)(?=.*[a-zA-Z])(?=.*[^\da-zA-Z\s]).{1,9}$

至少包含字母、数字、特殊字符，1-9位，并且不能连续出现3个大小连续或相同的数字(如：456、654、888)
^(?=.*\d)(?!.*(\d)\1{2})(?!.*(012|123|234|345|456|567|678|789|987|876|765|654|543|432|321|210))(?=.*[a-zA-Z])(?=.*[^\da-zA-Z\s]).{1,9}$


*/
